package global

import (
	"encoding/base64"
	"errors"
	"github.com/patrickmn/go-cache"
	"k8s-admin/models"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

type ClientInterface interface {
	NewClientSet(configText string) (*kubernetes.Clientset, error)
}
type clientResource struct {
}

func NewClientInterface() ClientInterface {
	return &clientResource{}
}

func (c *clientResource) NewClientSet(configText string) (*kubernetes.Clientset, error) {
	//	读取配置文件
	bytes, err := clientcmd.NewClientConfigFromBytes([]byte(configText))
	if err != nil {
		return nil, err
	}
	config, err := bytes.ClientConfig()
	if err != nil {

		return nil, err
	}
	// 生成对应的客户端
	clientSet, err := kubernetes.NewForConfig(config)
	if err != nil {

		return nil, err
	}
	//DiscoveryClient 接口，该接口可以用于在 Kubernetes ApiServer 中查询当前集群的资源及其版本.
	_, err = clientSet.Discovery().ServerVersion()
	if err != nil {

		return nil, err
	}
	return clientSet, nil
}

/*配置缓存*/
var ClientSetCache *cache.Cache

/*生成缓存客户端*/
func InitK8sClientCache() {
	ClientSetCache = cache.New(cache.NoExpiration, 0)

}

/*检查数据库中所有未删除集群的状态*/
func ClusterAllStatus() {
	go func() {
		cluster := []models.Configs{}
		tx := GORM.Model(&models.Configs{}).Find(&cluster)
		if tx.RowsAffected == 0 {
			TPLogger.Error(errors.New("目前没有集群数据").Error())
		} else if tx.Error != nil {
			TPLogger.Error(tx.Error.Error())
		} else {
			for _, v := range cluster {
				decodeString, _ := base64.StdEncoding.DecodeString(v.Text)
				_, err := NewClientInterface().NewClientSet(string(decodeString))
				if err != nil {

					if v.Status == 0 {
						// 更新数据库将集群状态设置为1，离线
						err = GORM.Model(&models.Configs{}).Where("c_id=?", v.CID).Update("status", 1).Error
						if err != nil {
							TPLogger.Error(err.Error())
						}
					}
				} else {
					if v.Status != 0 {
						// 更新数据库，集群状态设置为0，在线
						err = GORM.Model(&models.Configs{}).Where("c_id=?", v.CID).Update("status", 0).Error
						if err != nil {
							TPLogger.Error(err.Error())
						}
					}
				}
			}
		}
	}()
}
